﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Diagnostics;
//Librerias Arquitectura
using Com.Binaria.Core;
using Com.Binaria.Core.Base;
using Com.Binaria.Core.Dto;
using Com.Binaria.Core.Util;
using Com.Binaria.Core.Datos;
using Com.Binaria.Core.Exceptions;
using Com.Binaria.Core.Enumeracion;
//Librerias Proyecto
using Com.Binaria.SISCOB.Funcional.DTO;
using Com.Binaria.SISCOB.DTO;
using Com.Binaria.SISCOB.DAO;

namespace Com.Binaria.SISCOB.Dom
{
/// <summary>
///	clase de cuentacorriente dom
/// </summary>
public partial class CuentaCorrienteDom : ICuentaCorrienteDom
{
	

	#region metodos publicos

	

    /// <summary>
    /// metodo que permite registrar elementos de tipo cuentacorriente en el sistema
    /// </summary>
    /// <param name="p_Contexto">informacion del contexto</param>
    /// <param name="p_CuentaCorriente">cuentacorriente a registrar (insertar, actualizar o eliminar)</param>
    /// <param name="p_Accion">Accion a realizar</param>
    public CuentaCorrienteDTO ProbarRegistrar(ContextoDTO p_Contexto, CuentaCorrienteDTO p_CuentaCorriente)
	{
        //Prefijo del Metodo
        const String MPREFIX = " [ProbarRegistrar]";
		//Resultado accion insertar
		List<CuentaCorrienteDTO> listCtaCteResultDTO = null;
        CuentaCorrienteDTO ctaCteResultDTO = null;

        try
        {
            //Registro log de inicio del proceso
            Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Inicio);

            //Valida que exista informacion en el objeto
            AssertNull.notNullOrEmpty(p_CuentaCorriente);

            listCtaCteResultDTO = BuscarCuentaCorrienteFiltro(p_Contexto, new CuentaCorrienteDTO() { NmrCuenta = p_CuentaCorriente.NmrCuenta });
            if (listCtaCteResultDTO.Count == 0)
            {
                listCtaCteResultDTO = RegistrarCuentaCorriente(p_Contexto, new List<CuentaCorrienteDTO>() { p_CuentaCorriente }, EnumRegistrarAccion.Agregar);
            }
            else
            {
                if (listCtaCteResultDTO[0].Descripcion == null)
                {
                    ctaCteResultDTO = p_CuentaCorriente.Clone();
                    ctaCteResultDTO.Id = listCtaCteResultDTO[0].Id;
                    p_CuentaCorriente.Id = listCtaCteResultDTO[0].Id;
                    //p_CuentaCorriente.Descripcion = listCtaCteResultDTO[0].Descripcion;
                    listCtaCteResultDTO = RegistrarCuentaCorriente(p_Contexto, new List<CuentaCorrienteDTO>() { ctaCteResultDTO }, EnumRegistrarAccion.Modificar);
                    listCtaCteResultDTO.Add(p_CuentaCorriente);

                }
            }
            
            //Registro log de ejecucion el termino del metodo
            Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Termino);
        }
        catch (ManagerException me)
        {
            throw (me);
        }
        catch (ArquitecturaException ae)
        {
            throw (ae);
        }
        catch (Exception ex)
        {
            //Registro log de ejecucion con problemas
            Factoria.Log.Info(CLASS_PREFIX + MPREFIX + EnumMessagesEntry.Ejecucion_Problemas);
            //Genero error
            throw new ManagerException(Factoria.GetMessage("DOM_ERROR_NO_MANEJADO"), ex);
        }
        return listCtaCteResultDTO[0];
	}	
    #endregion metodos publicos

	}//End class CuentaCorrienteDom
}//End namespace





